package Modelo;

import Controlador.Controlador;

import java.util.Vector;

public class Lexico {

	int estado = 0;
	public Vector TablaSimbolos = new Vector();

	public Lexico() {
		CargarSimbolos();
	}

	public int Automata(char c) {
		switch (estado) {
		case 0:
			if (Character.isLetter(c)) {
				estado = 1;
			} else if (c == '<') {
				estado = 4;
			} else if (c == '=') {
				estado = 8;
			} else if (c == '>') {
				estado = 10;
			} else if (c == '+') {
				estado = 13;
			} else if (c == '-') {
				estado = 14;
			} else if (c == '*') {
				estado = 15;
			} else if (c == '/') {
				estado = 16;
			} else if (c == '^') {
				estado = 17;
			} else if (Character.isDigit(c)) {
				estado = 18;
			} else {
				return -1;
			}
		case 1:
			if (Character.isLetter(c)) {
				estado = 2;
			} else if (Character.isDigit(c)) {
				estado = 3;
			} else {
				return -1;
			}
			break;
		case 2:
			if (Character.isLetter(c)) {
				estado = 2;
			} else if (Character.isDigit(c)) {
				estado = 3;
			} else {
				return -1;
			}
			break;
		case 3:
			if (Character.isLetter(c)) {
				estado = 3;
			} else if (Character.isDigit(c)) {
				estado = 2;
			} else {
				return -1;
			}
			break;
		case 4:
			if (c == '=') {
				estado = 5;
			} else if (c == '>') {
				estado = 6;
			} else {
				estado = 7;
			}
			break;
		case 8:
			if (c == '=') {
				estado = 9;
			}
			break;
		case 10:
			if (c == '=') {
				estado = 11;
			} else {
				estado = 12;
			}
			break;
		case 18:
			if (Character.isDigit(c)) {
				estado = 18;
			} else if (c == '.') {
				estado = 19;
			} else {
				estado = 23;
			}
			break;
		case 19:
			if (Character.isDigit(c)) {
				estado = 20;
			} else {
				return -1;
			}
			break;
		case 20:
			if (Character.isDigit(c)) {
				estado = 20;
			} else {
				estado = 21;
			}
			break;
		default:
		}
		return 0;
	}

	public Simbolo getSimbolo(String lexema) {
		Simbolo simbolo = new Simbolo();
		for (int i = 0; i < TablaSimbolos.size(); i++) {
			if (((Simbolo) TablaSimbolos.get(i)).getLexemaId().equals(lexema)) {
				simbolo.setTokenId(((Simbolo) TablaSimbolos.get(i))
						.getTokenId());
				simbolo.setLexemaId(((Simbolo) TablaSimbolos.get(i))
						.getLexemaId());
				simbolo.setTipo(((Simbolo) TablaSimbolos.get(i)).getTipo());
				return simbolo;
			} else {
				simbolo.setTokenId("");
				simbolo.setLexemaId("");
				simbolo.setTipo("");
			}
		}
		return simbolo;
	}

	public void CargarSimbolos() {
		String[] strSimbolos;
		String[] linea;
		Controlador objArchivo = new Controlador();

		strSimbolos = objArchivo.ObtenerTabla();

		for (int i = 0; i < strSimbolos.length; i++) {
			linea = strSimbolos[i].split("~");

			Simbolo objSimbolos = new Simbolo();

			objSimbolos.setTokenId(linea[0]);
			objSimbolos.setLexemaId(linea[1]);
			objSimbolos.setTipo(linea[2]);

			TablaSimbolos.add(objSimbolos);
		}
	}
}
